设计模式:空对象模式(Null Object Pattern)

背景

群里聊到《ASP.NET设计模式》,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式,在此记录一下大概的结论。

典型结构

模式的结构非常简单,这里就不多说了,类图如下:

为什么使用这个模式?还需要null吗?

之所以需要这个模式是因为这个模式可以消除重复。想象一下,假如有多个消费端,每个消费端都要判断一下是否为空,而且对于为空的场景要做特殊的处理,这样就会导致很多重复。一些例子是:日志对象和缓存对象。

这个模式带来的另外一个好处就是方便做测试,这些Null Object类似Stub Object。

引入这个模式的前提是:“所有消费端对于空对象的行为的期望是一致的”,如果消费端A和消费端B对于“空”的处理方式不一样,就需要两个Null Object。对于大多数对象,他们不清楚为“空”时消费端到底需要啥行为,因此null还是需要的,而且大多数场景还是需要null

有些语言有nil对象,这种对象可以接受任何消息,这些消息不会出现异常,也没有返回结果,对于这种语言结构,编程时需要非常注意,很可能引入BUG,并不是说这种结构不好,我是非常喜欢的。

null object可以结合嵌套私有类,见下例:

 1         /// <summary>
 2         /// 返回后续处理器。
 3         /// </summary>
 4         public static IDeserializePostProcesser GetProcesser(Type resultType)
 5         {
 6             resultType.MustNotNull("resultType");
 7 
 8             if (_Processers.ContainsKey(resultType))
 9             {
10                 return _Processers[resultType];
11             }
12 
13             return new EmptyDeserializePostProcesser();
14         }
15 
16         private class EmptyDeserializePostProcesser : IDeserializePostProcesser
17         {
18             public object OnDeserialized(object result)
19             {
20                 return result;
21             }
22         }

备注

 社区和QQ是个好东西,这里有很多支持你的朋友,他们给你鼓励、意见和批评。谢谢兄弟们,加油!

 

posted on 2013-07-05 00:13  幸福框架  阅读(4156)  评论(10编辑  收藏  举报

导航

我要啦免费统计